﻿/******************************************************************************
 * Name			: Player.hpp
 * Author		: 671643387
 * Date			: 2015年9月13日
 * Description	:
 *****************************************************************************/

#ifndef COMMON_PLAYER_PLAYER_HPP_
#define COMMON_PLAYER_PLAYER_HPP_

#include <boost/noncopyable.hpp>
#include <boost/shared_ptr.hpp>
#include <dev/base/Mutex.hpp>
#include <dev/base/LockedQueue.hpp>
#include <dev/net/TcpConnection.hpp>
#include <common/packet/Packet.hpp>

namespace sxr
{
    namespace common
    {
		/**
		 * @brief 玩家数据类，所有玩家类型从该类继承
		 */
        class Player : public boost::noncopyable
        {
        public:
            Player(int id, dev::net::TcpConnectionPtr& conn);
			virtual ~Player(void);

            /**
             * @brief 获取Id
             * @return player id
             */
            int getId(void) const { return id_; }

            /**
             * @brief 处理数据包
             * @param packet    数据包
             * @return 成功返回true
             */
            virtual bool executePacket(PacketPtr packet);

            /**
             * @brief 移除玩家
             */
            virtual void onRemovePlayer(void) = 0;

            /**
             * @brief 心跳处理
             */
            virtual void onHeartbeat(void);

        public:
            /**
             * @brief 发送数据包
             * @param packet    数据包
             */
            void sendPacket(PacketPtr packet);

        private:
            void onMessage(dev::net::TcpConnection& conn, dev::net::TcpConnectionInputStream& is);
            void onConnectionError(dev::net::TcpConnection& conn);
            void onConnectionClosing(dev::net::TcpConnection& conn);
            void onConnectionHeartBeat(dev::net::TcpConnection& conn);
            void onConnectionWritable(dev::net::TcpConnection& conn);

        protected:
            int id_;
            dev::net::TcpConnectionPtr& conn_;

            // 发包队列
            typedef dev::base::LockedQueue<PacketPtr, dev::base::Mutex> SendPacketQueue;
            SendPacketQueue sendPackets_;
        };

		typedef boost::shared_ptr<Player> PlayerPtr;
    }
}

#endif /* COMMON_PLAYER_PLAYER_HPP_ */
